#ifndef DEVICE_CMOS_H
#define DEVICE_CMOS_H

#include <yonex/types.h>
#include <time.h>
#include <sys/io.h>

#define CMOS_ADDR_REG   0x70
#define CMOS_DATA_REG   0x71

#define ALARM_SECOND    0x01
#define ALARM_MINUTE    0x03
#define ALARM_HOUR      0x05
#define CMOS_STATUS_A   0x0a
#define CMOS_STATUS_B   0x0b
#define CMOS_STATUS_C   0x0c
#define CMOS_STATUS_D   0x0d
#define CMOS_NMI        0x80

// BCD 转 BIN
static __inline u8
Bcd2Bin(u8 bcd) { return (bcd >> 4) * 10 + (bcd & 0xf); }

// BIN 转 BCD
static __inline u8
Bin2Bcd(u8 bin) { return ((bin / 10) << 4) | (bin % 10); }

// 读 cmos 寄存器的值
static __inline u8 read_cmos(u8 addr) 
{
    outb(CMOS_ADDR_REG, CMOS_NMI | addr);
    return inb(CMOS_DATA_REG);    
}

// 写 cmos 寄存器的值
static __inline void write_cmos(u8 addr, u8 value)
{
    outb(CMOS_ADDR_REG, CMOS_NMI | addr);
    outb(CMOS_DATA_REG, value);
} 

void time_init();
void set_alarm(u32 seconds);

#endif
